package com.atguigu.gmall.user.controller;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.common.constant.RedisConst;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.common.util.IpUtil;
import com.atguigu.gmall.model.user.UserInfo;
import com.atguigu.gmall.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/api/user/passport")
public class PassportApiController {

    @Autowired
    private UserService userService;

    @Autowired
    private RedisTemplate redisTemplate;

    //登录
    @PostMapping("login")
    public Result login(@RequestBody UserInfo userInfo, HttpServletRequest request) {
        //登录时只需要用户名，密码
        UserInfo info = userService.login(userInfo);
        if (info != null) {
            //生成token 。并存储到cookie
            String token = UUID.randomUUID().toString();

            //声明一个map集合
            HashMap<String,Object> hashMap = new HashMap<>();
            //获取token
            hashMap.put("token",token);
            //获取昵称，
            hashMap.put("nickName",info.getNickName());

            //将用户ID，存储到缓存中
            String userLoginKey = RedisConst.USER_LOGIN_KEY_PREFIX + token;
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("userId",info.getId().toString());
            jsonObject.put("ip", IpUtil.getIpAddress(request));
            //  需要给个过期时间。 userId,ip
            this.redisTemplate.opsForValue().set(userLoginKey,jsonObject.toJSONString(),RedisConst.USERKEY_TIMEOUT, TimeUnit.SECONDS);

            //返回
            return Result.ok(hashMap);
        } else {
            return Result.fail().message("用户名或密码错误...");
        }
    }

    //  退出登录： /api/user/passport/logout
    @GetMapping("logout")
    public Result logout( HttpServletRequest request){
        //  本质：删除缓存数据. 删除cookie中的数据. 直接将cookie 对应的数据变为空. js 就能实现.
        //  删除缓存数据必须要有key
        //  token 存储在了 cookie 中，同时在 header 中也存在！
        String token = request.getHeader("token");
        String userLoginKey = RedisConst.USER_LOGIN_KEY_PREFIX + token;
        this.redisTemplate.delete(userLoginKey);
        //  返回数据.
        return Result.ok();
    }

}
